Раскройте возможности Pandas GroupBy для анализа данных. В этом руководстве рассматриваются методы агрегации и преобразования с практическими примерами для международных данных.
Освоение операций Pandas GroupBy: Агрегация против Трансформации
Pandas, краеугольный камень манипулирования данными в Python, предлагает мощный инструмент для анализа и понимания данных: операцию GroupBy. Эта функция позволяет сегментировать ваши данные на группы на основе общих характеристик, а затем применять функции к этим группам, раскрывая идеи, которые в противном случае остались бы скрытыми. Эта статья глубоко погружается в две ключевые операции GroupBy: агрегация и трансформация, предоставляя практические примеры и объяснения, подходящие для специалистов по данным во всем мире.
Понимание концепции GroupBy
По своей сути, GroupBy - это процесс, который включает в себя три основных этапа: разделение данных на группы на основе одного или нескольких критериев, применение функции к каждой группе независимо и объединение результатов в новую структуру данных. Эта стратегия «разделяй-применяй-объединяй» является фундаментальной концепцией в анализе данных и предоставляет гибкую основу для изучения сложных наборов данных.
Сила GroupBy заключается в ее способности обрабатывать различные типы и структуры данных, что делает ее применимой в различных областях. Анализируете ли вы данные о продажах из нескольких регионов, показания датчиков с разных устройств или активность в социальных сетях по демографическим группам, GroupBy может помочь вам извлечь значимые идеи.
Агрегация: Обобщение данных внутри групп
Агрегация - это процесс вычисления сводной статистики для каждой группы. Эти статистики предоставляют краткий обзор характеристик группы, позволяя вам сравнивать и сопоставлять различные сегменты ваших данных. Общие функции агрегации включают:
sum(): Вычисляет сумму значений внутри каждой группы.mean(): Вычисляет среднее значение внутри каждой группы.median(): Вычисляет среднее значение внутри каждой группы.min(): Находит минимальное значение внутри каждой группы.max(): Находит максимальное значение внутри каждой группы.count(): Подсчитывает количество ненулевых значений внутри каждой группы.size(): Возвращает размер каждой группы (включая null).std(): Вычисляет стандартное отклонение внутри каждой группы.var(): Вычисляет дисперсию внутри каждой группы.
Практические примеры агрегации
Рассмотрим набор данных о международных продажах для гипотетической компании электронной коммерции. Данные включают информацию о категории продукта, стране продажи и сумме продаж.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
Это выведет:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
Пример 1: Расчет общего объема продаж по категориям
Чтобы рассчитать общий объем продаж для каждой категории продуктов, мы можем использовать метод groupby(), за которым следует функция агрегации sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
Это выведет:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
Пример 2: Расчет среднего объема продаж по странам
Аналогично, чтобы рассчитать средний объем продаж по странам, мы можем использовать функцию агрегации mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
Это выведет:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
Пример 3: Использование нескольких функций агрегации
Pandas позволяет применять несколько функций агрегации одновременно, используя метод agg(). Это обеспечивает всестороннее обобщение характеристик группы.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
Это выведет:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
Пример 4: Пользовательские функции агрегации
Вы также можете определить свои собственные пользовательские функции агрегации, используя лямбда-выражения или именованные функции. Это позволяет вам вычислять определенные статистические данные, которые недоступны в стандартных функциях агрегации.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
Это выведет:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
Трансформация: Изменение данных внутри групп
Трансформация, с другой стороны, включает в себя изменение данных внутри каждой группы на основе некоторого вычисления. В отличие от агрегации, которая возвращает суммарное значение для каждой группы, трансформация возвращает значение для каждой строки в исходных данных, но значение вычисляется на основе группы, к которой принадлежит эта строка. Операции преобразования сохраняют исходный индекс и форму DataFrame.
Общие случаи использования преобразования включают:
- Стандартизация данных внутри каждой группы.
- Вычисление ранга или процентиля внутри каждой группы.
- Заполнение недостающих значений на основе статистики группы.
Практические примеры трансформации
Продолжим с нашими данными о международных продажах. Мы можем применить преобразование для выполнения расчетов, связанных с показателями продаж в каждой стране.
Пример 1: Стандартизация данных о продажах в каждой стране (Z-показатель)
Стандартизация данных включает в себя преобразование значений, чтобы иметь среднее значение 0 и стандартное отклонение 1. Это полезно для сравнения данных по разным масштабам и распределениям. Мы можем использовать метод transform() вместе с лямбда-выражением для достижения этой цели.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
Это выведет:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
Столбец Sales_Zscore теперь содержит стандартизированные значения продаж для каждой страны. Значения выше 0 выше среднего объема продаж для этой страны, а значения ниже 0 ниже среднего.
Пример 2: Расчет ранга продаж в каждой категории
Чтобы рассчитать ранг каждой продажи в своей категории, мы можем использовать метод rank() внутри функции transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
Это выведет:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Столбец Sales_Rank указывает ранг каждой продажи в соответствующей категории. Аргумент `method='dense'` гарантирует, что последовательные ранги присваиваются без пробелов.
Пример 3: Заполнение недостающих значений на основе среднего значения группы
Давайте введем несколько недостающих значений в данные о продажах, а затем заполним их на основе среднего объема продаж для каждой страны.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
Исходный DataFrame с недостающими значениями будет выглядеть так:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
А после заполнения недостающих значений:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
Важное замечание: Поскольку не существовало существующего среднего значения для `USA`, результирующие значения в `Sales_Filled` равны `NaN`. Обработка крайних случаев, таких как этот, имеет решающее значение для надежного анализа данных и должна учитываться во время реализации.
Агрегация против трансформации: Ключевые различия
Хотя и агрегация, и трансформация являются мощными операциями GroupBy, они служат разным целям и имеют различные характеристики:
- Форма вывода: Агрегация уменьшает размер данных, возвращая одно значение для каждой группы. Преобразование сохраняет исходный размер данных, возвращая преобразованное значение для каждой строки.
- Цель: Агрегация используется для обобщения данных и получения информации о характеристиках группы. Трансформация используется для изменения данных внутри групп, часто для стандартизации или нормализации.
- Возвращаемое значение: Агрегация возвращает новый DataFrame или Series с агрегированными значениями. Трансформация возвращает Series с преобразованными значениями, которые затем можно добавить в качестве нового столбца в исходный DataFrame.
Выбор между агрегацией и трансформацией зависит от ваших конкретных аналитических целей. Если вам нужно обобщить данные и сравнить группы, агрегация - подходящий выбор. Если вам нужно изменить данные внутри групп, сохраняя при этом исходную структуру данных, трансформация - лучший вариант.
Расширенные методы GroupBy
Помимо базовой агрегации и трансформации, Pandas GroupBy предлагает ряд расширенных методов для более сложного анализа данных.
Применение пользовательских функций с помощью apply()
Метод apply() обеспечивает наибольшую гибкость, позволяя применять любую пользовательскую функцию к каждой группе. Эта функция может выполнять любую операцию, включая агрегацию, трансформацию или даже более сложные вычисления.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
В этом примере мы определяем пользовательскую функцию, которая вычисляет сумму продаж в каждой группе (стране). Метод apply() применяет эту функцию к каждой группе, в результате чего создается новый столбец, содержащий сумму продаж для этой группы.
Важное замечание: Функция apply может быть более вычислительно интенсивной, чем другие методы. Оптимизируйте свой код и рассмотрите альтернативные реализации при работе с огромными наборами данных.
Группировка по нескольким столбцам
Вы можете сгруппировать свои данные по нескольким столбцам, чтобы создать более гранулированные сегменты. Это позволяет анализировать данные на основе пересечения нескольких характеристик.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
Это сгруппирует данные по Category и Country, позволяя вам рассчитать общий объем продаж для каждой категории в каждой стране. Это обеспечивает более подробное представление о показателях продаж в разных регионах и линейках продуктов.
Итерация по группам
Для более сложного анализа вы можете перебирать группы, используя цикл for. Это позволяет вам получить доступ к каждой группе индивидуально и выполнять пользовательские операции над ней.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
Это будет перебирать каждую категорию продукта и печатать соответствующие данные. Это может быть полезно для выполнения пользовательского анализа или создания отчетов для каждой категории.
Рекомендации по использованию GroupBy
Чтобы обеспечить эффективное и действенное использование GroupBy, рассмотрите следующие рекомендации:
- Понимание ваших данных: Перед применением
GroupByуделите время пониманию ваших данных и определите соответствующие критерии группировки и функции агрегации/преобразования. - Выберите правильную операцию: Тщательно подумайте, является ли агрегация или трансформация подходящим выбором для ваших аналитических целей.
- Оптимизируйте для производительности: Для больших наборов данных рассмотрите возможность оптимизации своего кода, используя векторизованные операции и избегая ненужных циклов.
- Обрабатывайте недостающие значения: Помните о недостающих значениях в ваших данных и обрабатывайте их соответствующим образом, используя такие методы, как
fillna()илиdropna(). - Документируйте свой код: Четко документируйте свой код, чтобы объяснить цель каждой операции
GroupByи обоснование вашего выбора.
Заключение
Pandas GroupBy - это мощный инструмент для анализа данных, позволяющий сегментировать ваши данные, применять функции к каждой группе и извлекать ценную информацию. Освоив методы агрегации и трансформации, вы сможете раскрыть весь потенциал своих данных и глубже понять основные закономерности и тенденции. Анализируете ли вы данные о продажах, показания датчиков или активность в социальных сетях, GroupBy может помочь вам принимать решения, основанные на данных, и достигать своих аналитических целей. Используйте возможности GroupBy и поднимите свои навыки анализа данных на новый уровень.
Это руководство предоставило всесторонний обзор операций Pandas GroupBy с акцентом на агрегацию против преобразования. Используя эти методы для международных данных, специалисты по данным во всем мире могут извлекать важную бизнес-информацию из различных наборов данных. Практикуйтесь, экспериментируйте и адаптируйте эти методы к своим конкретным потребностям, чтобы использовать весь потенциал Pandas.